#include <iostream>
#include <sstream>
#include <string>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <SDL/SDL_mixer.h>

#include "defines.h"

#include "estado_splash.h"
#include "fonte.h"
#include "audio.h"
#include "controles.h"

#define MAX_PLAYERS 4

using namespace std;
/******************************************************************************
    Construtor
    Seta o estado para futuras identificacoes
******************************************************************************/
Estado_Splash::Estado_Splash(void) {
    tipo_estado = ESTADO_SPLASH;
    delay = 0;
    dst.x = 0;
    dst.y = 0;
    dst.w = 0;
    dst.h = 0;
    delay = 300;
}

/******************************************************************************
    Destrutor
    Deleta objetos instanciados
******************************************************************************/
Estado_Splash::~Estado_Splash(void) {
    explosao.clear();
}

/******************************************************************************
    Carregar()
    Coloca na memoria todos elementos que serao utilizados por esta classe
******************************************************************************/
void Estado_Splash::Carregar(void){
    players = 1;
    std::vector<SDL_Rect> frames;
    Sprite::Carregar("amarelo",     "data/amarelo.bmp",     20, 20, frames);
    Sprite::Carregar("vermelho",    "data/vermelho.bmp",    20, 20, frames);
    Sprite::Carregar("azul",        "data/azul.bmp",        20, 20, frames);
    Sprite::Carregar("verde",       "data/verde.bmp",       20, 20, frames);
    Sprite::Carregar("roxo",        "data/roxo.bmp",        20, 20, frames);
    Sprite::Carregar("cinza",       "data/cinza.bmp",       20, 20, frames);
    Sprite::Carregar("laranja",     "data/laranja.bmp",     20, 20, frames);

#ifndef AUDIO_OFF
    Audio::PlayMusica("data/battle.mp3", 10);
#endif

      cout << "SPLASH OK!\n";
      cout.flush();
}

/******************************************************************************
    Atualizar
    Recebe os inputs e atualiza as entidades. Eh o responsavel pela transicao
******************************************************************************/
int Estado_Splash::Atualizar(Uint32 tempo) {
//cout << "\t Controles \n"; cout.flush();
    //Update nos eventos dos controles
    Controles::Atualizar();

    //Delay para que a tecla nao seja "apertada" milhoes de vezes
    if (delay <= 0) {

        //ESC pressionado
        if ( Controles::Get(5, 0) == 1 ) {
            return -1; //Exit code
        }
        
        //ENTER pressionado
        if ( (Controles::Get(5, 1) == 1) || (Controles::Get(0,3) == 1) ) {
            return players;
        }

        //ESQUERDA pressionado
        if ( (Controles::Get(5, 2) == 1) || (Controles::Get(0,0) == 1)) {
            delay = 200;
            players -= 1;
            if (players <= 0) {
                players = MAX_PLAYERS;
            }
        }
        
        //DIREITA pressionado
        if ( Controles::Get(5, 3) == 1 || Controles::Get(0,1) == 1) {
            delay = 200;
            players += 1;
            if (players >= MAX_PLAYERS+1) {
                players = 1;
            }
        }
    }
    //Se tiver com um delay, nao recebe nenhum input, soh aguarda
    else {
        delay -= tempo;
    }

#ifndef EXPLO_OFF
    //Explosoes
    //Atualiza estado das explosoes
    std::list<Explosao*>::iterator it;
    for (it = explosao.begin(); it != explosao.end(); it++) {
        (*it)->AtualizarSplash(tempo);
    }

    //Verifica fim das explosoes
    for (it = explosao.begin(); it != explosao.end();) {
        if ( (*it)->pecas.empty() ) {
             delete((*it));
             explosao.erase(it);
             //Tem alguma coisa maluca com os iterators, entao quando se
             //deleta algum elemento da lista, eu reseto o iterator pro
             //inicio da lista. Isso foi necessario pq estava bugando mto
             //os iterators.
             it = explosao.begin();
        } else {
            it++;
        }
    }

    if ( (rand() % 100) == 1) {
        int matriz[10] = {rand() % 6 + 1, rand() % 6 + 1, rand() % 6 + 1,
                rand() % 6 + 1, rand() % 6 + 1, rand() % 6 + 1,
                rand() % 6 + 1, rand() % 6 + 1, rand() % 6 + 1,
                rand() % 6 + 1};
        explosao.push_back(new Explosao(100 + (rand() % 420) , rand() % 15 + 10, matriz));
    }
#endif
    return ESTADO_NO_CHANGE;
}

/******************************************************************************
    Desenhar
    Chama as entidades e as desenha na tela
******************************************************************************/
void Estado_Splash::Desenhar(SDL_Surface *tela) {
     //cout << "\t Explosoes \n"; cout.flush();
#ifndef EXPLO_OFF
    //Desenha as explosoes
    std::list<Explosao*>::iterator it;
    for (it = explosao.begin(); it != explosao.end(); it++) {
        (*it)->Draw(tela);
    }
#endif

//cout << "\t Tetris battle \n"; cout.flush();
    Fonte::Print(420, 100, "Tetris Battle", 255, 0, 0, 1, 1, "vtks_128", tela);

//cout << "\t Conversao \n"; cout.flush();
    string ss;
    ss = "Jogadores     << ";
    char p[5];
    itoa(players, p, 10);
    ss.append(p);
    ss.append(" >>");

//cout << "\t escreve texto \n"; cout.flush();
    Fonte::Print(200, 200, ss.c_str(), 255, 255, 255, 1, 1, "capture_32", tela);
    
    Fonte::Print(800, 620, "Universidade de Brasilia", 255, 255, 255, 2, 2, "aero_12", tela);
    Fonte::Print(800, 636, "Construcao de Pecas Multimidias", 255, 255, 255, 2, 2, "aero_12", tela);
    Fonte::Print(800, 649, "Renan Leandro Ferreira", 255, 255, 255, 2, 2, "aero_12", tela);
//    cout << "\t Fim! \n"; cout.flush();
    
}
